package com.berchen.config;

import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

public class MyRealm  extends AuthorizingRealm {

    /**
     * 
     * @param principalCollection
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {

        /**
         * 获取用户账号，根据账号从数据库中获取角色、权限信息
         */
        Object obj = principalCollection.getPrimaryPrincipal();

        SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();

//        设置角色
//        simpleAuthorizationInfo.setRoles();
//        设置权限
//        simpleAuthorizationInfo.setStringPermissions();

        return simpleAuthorizationInfo;
    }

    /**
     * 用户登录认证的方法，shiro自动调用，当subject.login(token)的时候就被调用了
     * @param authenticationToken
     * @return
     * @throws AuthenticationException 如果认证失败，直接抛出异常
     *      *                                 <p>
     *      *                                 常用异常：
     *      *                                 UnknownAccountException 账号不存在
     *      *                                 AccountException 账号异常
     *      *                                 LockedAccountException 账号锁定（冻结）
     *      *                                 IncorrectCredentialsException 密码认证失败shiro自动抛出异常
     *      *                                 注意：如果这些异常不够用，可以自定义异常类并集成shiro认证异常父类。AuthenticationException
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        UsernamePasswordToken token=(UsernamePasswordToken) authenticationToken;
        String username = token.getUsername();
        String passward = new String(token.getPassword());


        Object passwardMd5 = new SimpleHash("MD5", "数据库中查询出来的密码", "", 2);

        // 创建密码认证对象，由shiro自动认证密码。
        // 参数一：要验证的账号
        // 参数二：数据库中读取出来的密码
        // 参数三：当前realm的名字
        // 如果密码认证成功，则返回一个用户身份对象。如果密码认证失败，shiro会抛出异常。
        return new SimpleAuthenticationInfo(username,passwardMd5,getName());
    }
}
